package JUC.第05章_中断机制_LockSupport;//自己自行停止，

import org.junit.Test;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * 中断此线程。
 * 除非当前线程正在中断(始终允许)，否则将调用此线程的checkAccess方法, 这可能会导致抛出SecurityException。
 *
 * 如果该线程阻塞的调用wait()，wait(long) ，或wait(long，int) 的方法Object类，
 * 或的join() ，join(long) ，join(long, int) ，sleep(long) ，或sleep(long int) ，这个类的方法，
 * 那么它的中断状态将被清除，并且将收到InterruptedException。
 *
 * 如果在InterruptibleChannel.上的I/O操作中阻止该线程,则通道将关闭,线程的中与状态将被设置,线程将收到ClosedByInterruptException。
 * 如果该线程在Selector中被阻塞,则线程的中断状态将被设置，它将立即从选择操作返回，可能具有非零值,就像调用选择器的wakeup方法一样。
 * 如果以前的条件都不成立，则将设置该线程的中断状态。
 * 中断不活动的线程不会产生任何影响。
 */
public class A3_Thread自带的中断 {

    @Test
    public void Thread自带的中断() {
        Thread thread = new Thread(()->{
            while (true){
                if(Thread.currentThread().isInterrupted()){
                    //判断当前线程的中断状态  通过中断标志位
                    System.out.println("Stop");
                    break;
                }
                System.out.println("运行中……");
                //睡眠，在进行 设置中断线程后会抛异常 java.lang.InterruptedException: sleep interrupted
                //最好在 睡眠的异常处理中进行 跳出循环
                //try {TimeUnit.MILLISECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();break;}
            }
        });
        thread.start();

        try {TimeUnit.MILLISECONDS.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
        //间隔时间

        new Thread(()->{
            thread.interrupt();//设置中断线程(即改变thread的中断标志位)为true
            //低层调用的是interrupt0 的native 的c++方法
        }).start();
    }
    @Test
    public void Thread自带的中断2() {
        Thread thread = new Thread(()->{
            while (true){
                if(Thread.currentThread().isInterrupted()){
                    //判断当前线程的中断状态  通过中断标志位
                    System.out.println("Stop");
                    break;
                }
                System.out.println("运行中.");

                try {TimeUnit.MILLISECONDS.sleep(2);/*Thread.sleep(2);*/} //使用了sleep  会将中断状态清除  所以需要再执行一次状态改变
                catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();;
                }

            }
        });
        thread.start();

        try {TimeUnit.MILLISECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
        //间隔时间

        new Thread(()->{
            thread.interrupt();//设置中断线程(即改变thread的中断标志位)为true
            //低层调用的是interrupt0 的native 的c++方法
        }).start();
    }

   @Test
    public void Thread证明不会立刻中断() {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 300; i++) {
                File f = new File("file/hello.txt");//为了时间慢点，
                System.out.print("----" + i);
            }
            System.out.println("\n当前程序最后中断标识:" + Thread.currentThread().isInterrupted());
        });
       thread.start();
       System.out.println("\n默认中断标识:" + thread.isInterrupted());
       try {TimeUnit.MILLISECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}
       //间隔时间
       thread.interrupt();//设置中断线程(即改变thread的中断标志位)为true
       System.out.println("\n设置中断标识:" + thread.isInterrupted());
       try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
       System.out.println("\n程序结束后中断标识:" + thread.isInterrupted());

   }

}
